#include "cmdTask.h"

task_t *_task_init()
{
    task_t *task = (task_t *)malloc(sizeof(task_t));
    bzero(task, sizeof(task_t));
    task->_cmdType = CMD_TYPE_INIT;
    return task;
}

void doTask(task_t *ptask)
{
    CmdType taskType = ptask->_cmdType;
    int netfd = ptask->_clientFd;
    switch (taskType)
    {
        case CMD_TYPE_CD:
            cmdCd(ptask); // 传递 netfd 以便与客户端通信
            break;
        case CMD_TYPE_LS:
            cmdLs(ptask);
            break;
        case CMD_TYPE_PWD:
            cmdPwd(ptask);
            break;
        case CMD_TYPE_MKDIR:
            cmdMkdir(ptask);
            break;
        case CMD_TYPE_RMDIR:
            cmdRmdir(ptask);
            break;
        case CMD_TYPE_REMOVE:
            cmdRemove(ptask);
            break;
        case CMD_TYPE_PUTS:
            cmdPuts(ptask); // 需实现文件上传逻辑
            break;
        case CMD_TYPE_GETS:
            cmdGets(ptask); // 需实现文件下载逻辑
            break;
        default:
            printf("Invalid Cmd\n");                      // 修正拼写错误
            send(netfd, "ERROR: Invalid Command", 21, 0); // 通知客户端
            break;
    }
}

/*
 * 建立目录栈
 * 返回值为真：路径正确；假，路径错误
 * 用于获得当前的虚假工作路径、绝对工作路径
 *
 */

bool _get_dirStack(task_t *ptask,         // 任务结构体指针
                   _dirStack_t *dirstack, // 未初始化的目录栈地址
                   char *absDir[],        // 绝对目录的地址
                   char *fakeDir[]        // 返回给客户端的相对目录的地址
)
{
    const char root[] = "/home/ming/cloudfile/"; // TODO 修改ming为用户名
    char *cmdPath = strdup(ptask->_data);
    // printf("cmdPath = %s\n", cmdPath);
    char *token = strtok(cmdPath, " "); // 去除命令中的"CD "
                                        // 切分路径
    cmdPath += strlen(token) + 1;
    // printf("cmdPath = %s\n", cmdPath);
    _dirStack_init(dirstack);
    char curpath[4096] = {0};
    token = strtok(NULL, "/");
    // printf("token = %s\n", token);// test
    while (token)
    {
        if (strcmp(token, ".") == 0)
        {
            token = strtok(NULL, "/");
            continue;
        }
        else if (strcmp(token, "..") == 0)
        {
            _dirStack_pop(dirstack);
        }
        else if (token)
        {
            _dirStack_push(dirstack, token);
        }
        else
        {
            break;
        }

        bzero(curpath, 4096 * sizeof(char));
        strcpy(curpath, root);
        strcat(curpath, _dirStack_getDir(dirstack));
        // printf("curpath = %s\n", curpath);
        token = strtok(NULL, "/");
    }
    curpath[strlen(curpath) - 1] = '\0';
    // printf("curpath = %s\n", curpath);
    if (access(curpath, F_OK) != 0)
    {
        fprintf(stderr, "cd wrong directory.\n");
        // free(cmdPath);// TODO
        return false;
    }

    char absstr[4096] = {0};
    strcat(absstr, root);
    strcat(absstr, curpath + strlen(root));
    // printf("absolute path = %s\n", absstr);
    // printf("cd token = %s\n", token);
    if (access(absstr, F_OK) != 0)
    {
        fprintf(stderr, "cd wrong directory.\n");
        free(cmdPath);
        return false;
    }

    char fakerRoot[4096] = {0};
    strcat(fakerRoot, "~/cloudfile/");
    strcat(fakerRoot, curpath + strlen(root));
    // printf("fakeRoot = %s\n", fakerRoot);

    //*absDir = (char*)calloc(strlen(absstr), sizeof(char));
    //*fakeDir = (char*)calloc(strlen(fakerRoot), sizeof(char));
    *absDir = strdup(absstr);
    *fakeDir = strdup(fakerRoot);
    return true;
}

void cmdCd(task_t *ptask)
{
    _dirStack_t dirstack;
    char *absDir;
    char *fakeDir;
    _get_dirStack(ptask, &dirstack, &absDir, &fakeDir);
    printf("absDir = %s\n", absDir);
    printf("fakeDir = %s\n", fakeDir);
    printf(" CD SUCCESS!\n");
}

/*


*/
void cmdLs(task_t *ptask) { printf(" LS SUCCESS!\n"); }

/*


*/
void cmdPwd(task_t *ptask) { printf("PWD SUCCESS!\n"); }

/*


*/
void cmdMkdir(task_t *ptask)
{
    char filename[200] = {0};
    memcpy(filename, ptask->_data, sizeof(ptask->_data));
    printf("filename:%s\n", filename);
    printf("MKDIR SUCCESS!\n");
}

/*


*/
void cmdRmdir(task_t *ptask) { printf("RMDIR SUCCESS!\n"); }

/*


*/
void cmdPuts(task_t *ptask)
{
    char filename[200] = {0};
    memcpy(filename, ptask->_data, sizeof(ptask->_data));

    printf("PUTS SUCCESS!\n");
}
/*


*/
void cmdGets(task_t *ptask) { printf("GETS SUCCESS!\n"); }
/*


*/
void cmdRemove(task_t *ptask) { printf("REMOVE SUCCESS!\n"); }

// int main(int argc, char *args[])
// {
//     // ARGS_CHECK(argc, 2);
//     //  创建并初始化 task_t 结构体
//     // char path[4096] = { 0 };
//     // strcpy(path, "cd ");
//
//     task_t testTask;
//     testTask._cmdType = CMD_TYPE_CD;
//     testTask._clientFd = 1; // 这里假设客户端文件描述符为 1
//     strcpy(testTask._data, "cd dir1/dir2/../../cloud_client/client.c");
//
//     // 调用 cmdCd 进行测试
//     cmdCd(&testTask);
//
//     return 0;
// }
